//package com.hww.common.util;
//
//import static android.Manifest.permission.EXPAND_STATUS_BAR;
//
//import android.annotation.SuppressLint;
//import android.app.Activity;
//import android.content.Context;
//import android.content.res.Resources;
//import android.graphics.Color;
//import android.graphics.Point;
//import android.os.Build;
//import android.util.TypedValue;
//import android.view.Display;
//import android.view.KeyCharacterMap;
//import android.view.KeyEvent;
//import android.view.View;
//import android.view.ViewConfiguration;
//import android.view.ViewGroup;
//import android.view.ViewGroup.MarginLayoutParams;
//import android.view.Window;
//import android.view.WindowManager;
//
//import androidx.annotation.ColorInt;
//import androidx.annotation.NonNull;
//import androidx.annotation.RequiresApi;
//import androidx.annotation.RequiresPermission;
//import androidx.drawerlayout.widget.DrawerLayout;
//
//import com.hww.common.MyAppThis;
//
//import java.lang.reflect.Method;
//
///**
// * 状态栏相关工具类
// */
//public final class BarUtils {
//
//    ///////////////////////////////////////////////////////////////////////////
//    // status bar
//    ///////////////////////////////////////////////////////////////////////////
//    /*状态栏标签常量*/
//    private static final String TAG_STATUS_BAR = "TAG_STATUS_BAR";
//    /*偏移标签常量*/
//    private static final String TAG_OFFSET = "TAG_OFFSET";
//    /*状态栏偏移键值常量*/
//    private static final int KEY_OFFSET = -123;
//
//    private BarUtils() {
//        throw new UnsupportedOperationException("u can't instantiate me...");
//    }
//
//    /**
//     * 获取状态栏高度
//     * <p>
//     * 通过资源id获取状态栏高度。此方法适用于获取系统默认的状态栏高度。
//     *
//     * @return 状态栏的高度，以像素为单位。
//     */
//    public static int getStatusBarHeight() {
//        Resources resources = Resources.getSystem();
//        int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
//        return resources.getDimensionPixelSize(resourceId);
//    }
//
//    /**
//     * 控制状态栏的可见性。
//     *
//     * @param activity  当前的Activity实例，用于获取Window实例。
//     * @param isVisible 如果为true，则显示状态栏；如果为false，则隐藏状态栏。
//     */
//    public static void setStatusBarVisibility(@NonNull final Activity activity,
//                                              final boolean isVisible) {
//        setStatusBarVisibility(activity.getWindow(), isVisible);
//    }
//
//    /**
//     * 设置状态栏的可见性。
//     * 通过操作窗口的属性，切换状态栏的可见状态。当状态栏可见时，取消全屏模式并显示状态栏视图；
//     * 当状态栏隐藏时，进入全屏模式并隐藏状态栏视图。
//     *
//     * @param window    需要操作的窗口对象，用于设置窗口属性。
//     * @param isVisible 指定状态栏的可见性，true表示可见，false表示隐藏。
//     */
//    public static void setStatusBarVisibility(@NonNull final Window window,
//                                              final boolean isVisible) {
//        if (isVisible) {
//            window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//            showStatusBarView(window);
//            addMarginTopEqualStatusBarHeight(window);
//        } else {
//            window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//            hideStatusBarView(window);
//            subtractMarginTopEqualStatusBarHeight(window);
//        }
//    }
//
//    /**
//     * 返回状态栏是否可见。
//     *
//     * @param activity 操作的活动界面。
//     * @return {@code true} 表示可见，{@code false} 表示不可见。
//     */
//    public static boolean isStatusBarVisible(@NonNull final Activity activity) {
//        int flags = activity.getWindow().getAttributes().flags;
//        return (flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0;
//    }
//
//    /**
//     * 设置状态栏的亮色模式。
//     *
//     * @param activity    操作的活动界面。
//     * @param isLightMode true 表示设置亮色模式，false 表示取消亮色模式。
//     */
//    public static void setStatusBarLightMode(@NonNull final Activity activity,
//                                             final boolean isLightMode) {
//        setStatusBarLightMode(activity.getWindow(), isLightMode);
//    }
//
//    /**
//     * 设置状态栏的亮色模式。
//     *
//     * @param window      操作的窗口。
//     * @param isLightMode true 表示设置亮色模式，false 表示取消亮色模式。
//     */
//    public static void setStatusBarLightMode(@NonNull final Window window,
//                                             final boolean isLightMode) {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//            View decorView = window.getDecorView();
//            int vis = decorView.getSystemUiVisibility();
//            if (isLightMode) {
//                vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
//            } else {
//                vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
//            }
//            decorView.setSystemUiVisibility(vis);
//        }
//    }
//
//    /**
//     * 返回状态栏是否处于亮色模式。
//     *
//     * @param activity 操作的活动界面。
//     * @return {@code true} 表示亮色模式，{@code false} 表示非亮色模式。
//     */
//    public static boolean isStatusBarLightMode(@NonNull final Activity activity) {
//        return isStatusBarLightMode(activity.getWindow());
//    }
//
//    /**
//     * 返回状态栏是否处于亮色模式。
//     *
//     * @param window 操作窗口。
//     * @return {@code true} 表示亮色模式，{@code false} 表示非亮色模式。
//     */
//    public static boolean isStatusBarLightMode(@NonNull final Window window) {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//            View decorView = window.getDecorView();
//            int vis = decorView.getSystemUiVisibility();
//            return (vis & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0;
//        }
//        return false;
//    }
//
//    /**
//     * 为视图添加与状态栏等高的顶部间距。
//     *
//     * @param view 要操作的视图。
//     */
//    public static void addMarginTopEqualStatusBarHeight(@NonNull View view) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        view.setTag(TAG_OFFSET);
//        Object haveSetOffset = view.getTag(KEY_OFFSET);
//        if (haveSetOffset != null && (Boolean) haveSetOffset) return;
//        MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
//        layoutParams.setMargins(layoutParams.leftMargin,
//                layoutParams.topMargin + getStatusBarHeight(),
//                layoutParams.rightMargin,
//                layoutParams.bottomMargin);
//        view.setTag(KEY_OFFSET, true);
//    }
//
//    /**
//     * 为视图减去与状态栏等高的顶部间距。
//     *
//     * @param view 要操作的视图。
//     */
//    public static void subtractMarginTopEqualStatusBarHeight(@NonNull View view) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        Object haveSetOffset = view.getTag(KEY_OFFSET);
//        if (haveSetOffset == null || !(Boolean) haveSetOffset) return;
//        MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
//        layoutParams.setMargins(layoutParams.leftMargin,
//                layoutParams.topMargin - getStatusBarHeight(),
//                layoutParams.rightMargin,
//                layoutParams.bottomMargin);
//        view.setTag(KEY_OFFSET, false);
//    }
//
//    /**
//     * 为窗口添加与状态栏等高的顶部间距。
//     *
//     * @param window 要操作的窗口。
//     */
//    private static void addMarginTopEqualStatusBarHeight(@NonNull final Window window) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        View withTag = window.getDecorView().findViewWithTag(TAG_OFFSET);
//        if (withTag == null) return;
//        addMarginTopEqualStatusBarHeight(withTag);
//    }
//
//    /**
//     * 为窗口减去与状态栏等高的顶部间距。
//     *
//     * @param window 要操作的窗口。
//     */
//    private static void subtractMarginTopEqualStatusBarHeight(@NonNull final Window window) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        View withTag = window.getDecorView().findViewWithTag(TAG_OFFSET);
//        if (withTag == null) return;
//        subtractMarginTopEqualStatusBarHeight(withTag);
//    }
//
//    /**
//     * 设置状态栏的颜色。
//     *
//     * @param activity 操作的活动。
//     * @param color    状态栏的颜色。
//     * @return 状态栏的视图对象。
//     */
//    public static View setStatusBarColor(@NonNull final Activity activity,
//                                         @ColorInt final int color) {
//        return setStatusBarColor(activity, color, false);
//    }
//
//    /**
//     * 设置状态栏颜色。
//     * 本方法用于根据不同的Android系统版本，设置指定Activity的状态栏颜色。如果系统版本低于KITKAT，则不进行任何操作。
//     *
//     * @param activity 需要设置状态栏颜色的Activity对象，不能为空。
//     * @param color    指定的状态栏颜色，使用ARGB格式的整数表示。
//     * @param isDecor  指示是否应该将状态栏颜色应用于Window的装饰（如标题栏）。 true表示应用，false表示不应用。
//     * @return 如果方法执行成功，返回应用了状态栏颜色的View；如果系统版本不支持或不需要应用颜色，返回null。
//     */
//    public static View setStatusBarColor(@NonNull final Activity activity,
//                                         @ColorInt final int color,
//                                         final boolean isDecor) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return null;
//        transparentStatusBar(activity);
//        return applyStatusBarColor(activity, color, isDecor);
//    }
//
//    /**
//     * 设置应用窗口的模拟状态栏颜色。
//     *
//     * @param window 要设置状态栏颜色的窗口对象。
//     * @param color  指定的状态栏颜色，使用ARGB格式的整数表示。
//     * @return 如果方法成功应用了状态栏颜色，则返回用于设置颜色的视图；如果SDK版本低于19或操作失败，则返回null。
//     */
//    public static View setStatusBarColor(@NonNull final Window window,
//                                         @ColorInt final int color) {
//        return setStatusBarColor(window, color, false);
//    }
//
//    /**
//     * 设置应用窗口的模拟状态栏颜色。
//     * 本方法适用于Android 4.4（API级别19）及更高版本。在较低版本的Android中，此方法无效。
//     *
//     * @param window  要设置状态栏颜色的窗口对象。
//     * @param color   指定的状态栏颜色，使用ARGB格式的整数表示。
//     * @param isDecor 指示是否应将颜色应用于窗口装饰（如标题栏）的布尔值。
//     * @return 如果方法成功应用了状态栏颜色，则返回用于设置颜色的视图；如果SDK版本低于19或操作失败，则返回null。
//     */
//    public static View setStatusBarColor(@NonNull final Window window,
//                                         @ColorInt final int color,
//                                         final boolean isDecor) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return null;
//        transparentStatusBar(window);
//        return applyStatusBarColor(window, color, isDecor);
//    }
//
//    /**
//     * 设置模拟状态栏的颜色。
//     * 此方法用于在Android 4.4 (KitKat) 及以上版本中设置状态栏的颜色。通过创建一个模拟的状态栏视图，
//     * 并将其颜色设置为指定值来实现。此方法不适用于Android 4.4以下的版本。
//     *
//     * @param fakeStatusBar 用于模拟状态栏的视图。这个视图将会被设置为和状态栏一样高，并显示指定的颜色。
//     * @param color         指定的状态栏颜色。这个颜色将被应用于模拟状态栏的视图。
//     */
//    public static void setStatusBarColor(@NonNull final View fakeStatusBar,
//                                         @ColorInt final int color) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        Activity activity = ActivityUtils.getActivityByContext(fakeStatusBar.getContext());
//        if (activity == null) return;
//        transparentStatusBar(activity);
//        fakeStatusBar.setVisibility(View.VISIBLE);
//        ViewGroup.LayoutParams layoutParams = fakeStatusBar.getLayoutParams();
//        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
//        layoutParams.height = getStatusBarHeight();
//        fakeStatusBar.setBackgroundColor(color);
//    }
//
//    /**
//     * 设置自定义的状态栏。
//     * 此方法用于在API 19及更高版本中设置一个自定义的状态栏视图。它首先检查当前的API级别，
//     * 如果低于19，则不执行任何操作。然后，它尝试获取当前视图的上下文相关的活动。
//     * 如果无法获取活动，则退出方法。接下来，它使状态栏透明，并对自定义状态栏视图进行布局参数调整，
//     * 以匹配系统状态栏的高度和宽度。
//     *
//     * @param fakeStatusBar 用于模拟状态栏的视图。这个视图将被设置为状态栏的高度和全宽度。
//     */
//    public static void setStatusBarCustom(@NonNull final View fakeStatusBar) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        Activity activity = ActivityUtils.getActivityByContext(fakeStatusBar.getContext());
//        if (activity == null) return;
//        transparentStatusBar(activity);
//        fakeStatusBar.setVisibility(View.VISIBLE);
//        ViewGroup.LayoutParams layoutParams = fakeStatusBar.getLayoutParams();
//        if (layoutParams == null) {
//            layoutParams = new ViewGroup.LayoutParams(
//                    ViewGroup.LayoutParams.MATCH_PARENT,
//                    getStatusBarHeight()
//            );
//            fakeStatusBar.setLayoutParams(layoutParams);
//        } else {
//            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
//            layoutParams.height = getStatusBarHeight();
//        }
//    }
//
//    /**
//     * 设置DrawerLayout的状态栏颜色。
//     *
//     * @param drawer        DrawerLayout控件实例，用于设置状态栏颜色。
//     * @param fakeStatusBar 一个用于模拟状态栏的View，主要用于在某些情况下调整布局的高度和颜色。
//     * @param color         状态栏的颜色值，使用ARGB格式的整数表示。
//     */
//    public static void setStatusBarColor4Drawer(@NonNull final DrawerLayout drawer,
//                                                @NonNull final View fakeStatusBar,
//                                                @ColorInt final int color) {
//        setStatusBarColor4Drawer(drawer, fakeStatusBar, color, false);
//    }
//
//    /**
//     * 设置DrawerLayout的状态栏颜色。
//     * 此方法主要用于在Android 4.4及以上版本中更改DrawerLayout的状态栏颜色，并处理与之相关的一些布局问题。
//     *
//     * @param drawer        DrawerLayout控件实例，用于设置状态栏颜色。
//     * @param fakeStatusBar 一个用于模拟状态栏的View，主要用于在某些情况下调整布局的高度和颜色。
//     * @param color         状态栏的颜色值，使用ARGB格式的整数表示。
//     * @param isTop         标志位，指示fakeStatusBar是否位于布局的顶部。用于处理不同的布局策略。
//     */
//    public static void setStatusBarColor4Drawer(@NonNull final DrawerLayout drawer,
//                                                @NonNull final View fakeStatusBar,
//                                                @ColorInt final int color,
//                                                final boolean isTop) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        Activity activity = ActivityUtils.getActivityByContext(fakeStatusBar.getContext());
//        if (activity == null) return;
//        transparentStatusBar(activity);
//        drawer.setFitsSystemWindows(false);
//        setStatusBarColor(fakeStatusBar, color);
//        for (int i = 0, count = drawer.getChildCount(); i < count; i++) {
//            drawer.getChildAt(i).setFitsSystemWindows(false);
//        }
//        if (isTop) {
//            hideStatusBarView(activity);
//        } else {
//            setStatusBarColor(activity, color, false);
//        }
//    }
//
//    /**
//     * 设置应用程序状态栏的颜色。
//     * <p>
//     * 此方法主要用于改变指定Activity的状态栏颜色。通过传入Activity对象和颜色值，
//     * 实现状态栏颜色的自定义。如果isDecor参数为真，则颜色应用到DecorView上。
//     *
//     * @param activity 需要改变状态栏颜色的Activity对象，不能为空。
//     * @param color    指定的状态栏颜色值。
//     * @param isDecor  指示是否将颜色应用到DecorView上，一般用于内部逻辑判断。
//     * @return 假的状态栏视图，用于实现颜色的改变。
//     */
//    private static View applyStatusBarColor(@NonNull final Activity activity,
//                                            final int color,
//                                            boolean isDecor) {
//        return applyStatusBarColor(activity.getWindow(), color, isDecor);
//    }
//
//    /**
//     * 应用状态栏颜色。
//     * 通过创建或查找一个假的状态栏视图，并设置其颜色，来实现状态栏颜色的改变。
//     * 如果视图已存在，则只需更改颜色；如果不存在，则创建并添加到父视图中。
//     *
//     * @param window  需要应用状态栏颜色的窗口。
//     * @param color   状态栏的颜色值。
//     * @param isDecor 指示是否操作装饰视图，默认状态栏颜色应用在DecorView上。
//     * @return 假的状态栏视图，用于实际显示颜色。
//     */
//    private static View applyStatusBarColor(@NonNull final Window window,
//                                            final int color,
//                                            boolean isDecor) {
//        ViewGroup parent = isDecor ?
//                /*获取当前窗口的顶层视图，即窗口的装饰视图。装饰视图包括整个窗口的内容，通常包括标题栏、状态栏等系统装饰元素*/
//                (ViewGroup) window.getDecorView() :
//                /*获取窗口中的内容视图。内容视图是应用实际显示的主要视图部分，不包括系统装饰元素，例如标题栏和状态栏*/
//                /*android.R.id.content 是 Android 系统提供的用于标识内容视图的资源ID*/
//                (ViewGroup) window.findViewById(android.R.id.content);
//        View fakeStatusBarView = parent.findViewWithTag(TAG_STATUS_BAR);
//        if (fakeStatusBarView != null) {
//            if (fakeStatusBarView.getVisibility() == View.GONE) {
//                fakeStatusBarView.setVisibility(View.VISIBLE);
//            }
//            fakeStatusBarView.setBackgroundColor(color);
//        } else {
//            fakeStatusBarView = createStatusBarView(window.getContext(), color);
//            parent.addView(fakeStatusBarView);
//        }
//        return fakeStatusBarView;
//    }
//
//    /**
//     * 隐藏状态栏视图。
//     *
//     * @param activity activity对象
//     */
//    private static void hideStatusBarView(@NonNull final Activity activity) {
//        hideStatusBarView(activity.getWindow());
//    }
//
//    /**
//     * 隐藏状态栏视图。
//     * 此方法用于隐藏一个先前创建的伪造状态栏视图。这种情况可能发生在需要动态地显示或隐藏状态栏时。
//     * 通过查找标签为TAG_STATUS_BAR的视图，并将其可见性设置为GONE，从而实现隐藏状态栏的效果。
//     *
//     * @param window 当前窗口对象，用于获取装饰视图并进行操作。确保此参数不为null，因为方法标记为@NonNull。
//     */
//    private static void hideStatusBarView(@NonNull final Window window) {
//        ViewGroup decorView = (ViewGroup) window.getDecorView();
//        View fakeStatusBarView = decorView.findViewWithTag(TAG_STATUS_BAR);
//        if (fakeStatusBarView == null) return;
//        fakeStatusBarView.setVisibility(View.GONE);
//    }
//
//    /**
//     * 显示状态栏视图。
//     * 此方法用于在给定的窗口中显示一个模拟的状态栏视图。如果窗口的装饰视图中存在一个带有指定标签的状态栏视图，
//     * 则将其可见性设置为可见。这个方法主要用于在需要时动态显示或隐藏状态栏视图，以实现特定的界面效果或布局调整。
//     *
//     * @param window 需要操作状态栏视图的窗口对象。这个参数不能为null，以确保方法能够正常获取到窗口的装饰视图。
//     */
//    private static void showStatusBarView(@NonNull final Window window) {
//        /*获取窗口的装饰视图*/
//        ViewGroup decorView = (ViewGroup) window.getDecorView();
//        /*通过标签查找装饰视图中是否有一个模拟的状态栏视图*/
//        View fakeStatusBarView = decorView.findViewWithTag(TAG_STATUS_BAR);
//        /*如果找不到模拟的状态栏视图，则直接返回，不进行后续操作*/
//        if (fakeStatusBarView == null) return;
//        /*将找到的模拟状态栏视图的可见性设置为可见*/
//        fakeStatusBarView.setVisibility(View.VISIBLE);
//    }
//
//    /**
//     * 创建一个模拟的状态栏视图。
//     * 这个方法用于在需要的地方动态创建一个状态栏高度的视图，通常用于模拟状态栏或者在某些情况下替代状态栏。
//     *
//     * @param context 用于创建视图的上下文对象，必须不为空。
//     * @param color   视图的背景颜色，用于设置状态栏的颜色。
//     * @return 返回一个新创建的状态栏视图，该视图的高度为状态栏高度，颜色为指定的颜色。
//     */
//    private static View createStatusBarView(@NonNull final Context context,
//                                            final int color) {
//        View statusBarView = new View(context);
//        statusBarView.setLayoutParams(new ViewGroup.LayoutParams(
//                ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight()));
//        statusBarView.setBackgroundColor(color);
//        statusBarView.setTag(TAG_STATUS_BAR);
//        return statusBarView;
//    }
//
//    /**
//     * 设置窗口状态栏的透明度。
//     *
//     * @param activity 用于设置状态栏透明的Activity对象，不能为空
//     */
//    public static void transparentStatusBar(@NonNull final Activity activity) {
//        transparentStatusBar(activity.getWindow());
//    }
//
//    /**
//     * 设置窗口状态栏的透明度。
//     * 该方法根据Android系统的版本，采用不同的方式来实现状态栏透明。
//     * 对于Android 5.0（Lollipop）及更高版本，使用新的API来清除和添加窗口标志以实现透明状态栏。
//     * 对于Android 4.4（KitKat）到4.4W.2（KitKat Watch）的版本，使用FLAG_TRANSLUCENT_STATUS标志来实现状态栏透明。
//     *
//     * @param window 要设置状态栏透明的窗口对象。
//     */
//    public static void transparentStatusBar(@NonNull final Window window) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        /*对于5.0及以上版本，使用新的API来设置状态栏透明并自定义颜色*/
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//            /*清除旧的透明状态栏标志*/
//            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//            /*添加新的标志来允许窗口绘制状态栏背景*/
//            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//            /*设置布局选项，使其包含状态栏和全屏布局*/
//            int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
//            /*获取当前的系统UI可见性标志，并与新的布局选项合并*/
//            int vis = window.getDecorView().getSystemUiVisibility();
//            window.getDecorView().setSystemUiVisibility(option | vis);
//            /*设置状态栏颜色为透明*/
//            window.setStatusBarColor(Color.TRANSPARENT);
//        } else {
//            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//        }
//    }
//
//    ///////////////////////////////////////////////////////////////////////////
//    // action bar
//    ///////////////////////////////////////////////////////////////////////////
//
//    /**
//     * 获取ActionBar的高度。
//     * ActionBar是Android系统中一个用于展示应用标题、导航模式以及操作按钮等的组件。
//     * 本方法通过查询系统主题中的actionBarSize属性来获取ActionBar的高度。
//     *
//     * @return ActionBar的高度，如果无法获取则返回0。
//     */
//    public static int getActionBarHeight() {
//        TypedValue tv = new TypedValue();
//        if (MyAppThis.getThis().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
//            return TypedValue.complexToDimensionPixelSize(
//                    tv.data, MyAppThis.getThis().getResources().getDisplayMetrics()
//            );
//        }
//        return 0;
//    }
//
//    ///////////////////////////////////////////////////////////////////////////
//    // notification bar
//    ///////////////////////////////////////////////////////////////////////////
//
//    /**
//     * 设置通知栏的显示或隐藏。
//     * <p>Must hold {@code <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />}</p>
//     * 该方法通过反射调用系统方法来实现通知栏的展开或收起，兼容性处理了Android 4.1（API级别16）及以下的版本。
//     * 在Android 4.1及以上版本中，使用了新的方法名来控制通知栏。
//     *
//     * @param isVisible 如果为true，则展开通知栏；如果为false，则收起通知栏。
//     */
//    @RequiresPermission(EXPAND_STATUS_BAR)
//    public static void setNotificationBarVisibility(final boolean isVisible) {
//        String methodName;
//        if (isVisible) {
//            methodName = (Build.VERSION.SDK_INT <= 16) ? "expand" : "expandNotificationsPanel";
//        } else {
//            methodName = (Build.VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels";
//        }
//        invokePanels(methodName);
//    }
//
//    /**
//     * 调用系统方法来控制状态栏的展开或收起。
//     * 该方法通过反射机制调用StatusBarManager的服务来实现对状态栏的操作。
//     * 主要用于在一些需要自动或手动控制状态栏显示状态的场景中。
//     *
//     * @param methodName 方法名，用于指定要执行的操作，通常是"expand"或"collapse"。
//     *                   "expand"用于展开状态栏，"collapse"用于收起状态栏。
//     */
//    private static void invokePanels(final String methodName) {
//        try {
//            @SuppressLint("WrongConstant")
//            Object service = MyAppThis.getThis().getSystemService("statusbar");
//            @SuppressLint("PrivateApi")
//            Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
//            Method expand = statusBarManager.getMethod(methodName);
//            expand.invoke(service);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    ///////////////////////////////////////////////////////////////////////////
//    // navigation bar
//    ///////////////////////////////////////////////////////////////////////////
//
//    /**
//     * 获取设备导航栏的高度。
//     * 该方法通过资源标识符来获取导航栏的高度，适用于支持导航栏的设备。
//     * 如果设备没有导航栏或API不支持导航栏高度的获取，则返回0。
//     *
//     * @return 导航栏的高度，单位为像素。如果设备没有导航栏或无法获取高度，则返回0。
//     */
//    public static int getNavBarHeight() {
//        Resources res = Resources.getSystem();
//        int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
//        if (resourceId != 0) {
//            return res.getDimensionPixelSize(resourceId);
//        } else {
//            return 0;
//        }
//    }
//
//    /**
//     * 设置导航栏的显示或隐藏。
//     * 该方法用于根据参数决定是否显示导航栏。由于导航栏的显示与隐藏受Android系统版本及设备厂商的影响，
//     * 因此此方法可能在某些设备或系统版本上无法生效。
//     *
//     * @param activity  当前的Activity对象，用于获取Window对象以操作导航栏。
//     * @param isVisible 如果为true，则显示导航栏；如果为false，则隐藏导航栏。
//     */
//    public static void setNavBarVisibility(@NonNull final Activity activity, boolean isVisible) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        setNavBarVisibility(activity.getWindow(), isVisible);
//
//    }
//
//    /**
//     * 设置导航栏的显示或隐藏。
//     * 该方法用于根据参数决定是否显示导航栏。由于导航栏的显示与隐藏受Android系统版本及设备厂商的影响，
//     * 因此此方法可能在某些设备或系统版本上无法生效。
//     *
//     * @param window    Window窗口对象以操作导航栏。
//     * @param isVisible 如果为true，则显示导航栏；如果为false，则隐藏导航栏。
//     */
//    public static void setNavBarVisibility(@NonNull final Window window, boolean isVisible) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
//        final ViewGroup decorView = (ViewGroup) window.getDecorView();
//        for (int i = 0, count = decorView.getChildCount(); i < count; i++) {
//            final View child = decorView.getChildAt(i);
//            final int id = child.getId();
//            if (id != View.NO_ID) {
//                String resourceEntryName = getResNameById(id);
//                if ("navigationBarBackground".equals(resourceEntryName)) {
//                    child.setVisibility(isVisible ? View.VISIBLE : View.INVISIBLE);
//                }
//            }
//        }
//        final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
//                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
//        if (isVisible) {
//            decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() & ~uiOptions);
//        } else {
//            decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() | uiOptions);
//        }
//    }
//
//    /**
//     * 判断导航栏是否可见。
//     * <p>Call it in onWindowFocusChanged will get right result.</p>
//     *
//     * @param activity 用于获取窗口引用的Activity对象。这个参数不能为null，以确保能够正常执行方法逻辑。
//     * @return 如果导航栏可见，则返回true；否则返回false。这提供了一个明确的布尔值来表示导航栏的可见状态。
//     */
//    public static boolean isNavBarVisible(@NonNull final Activity activity) {
//        return isNavBarVisible(activity.getWindow());
//    }
//
//    /**
//     * 判断导航栏是否可见。
//     * 通过检查装饰视图中的子视图来判断导航栏是否可见。特别地，寻找一个具有特定资源名
//     * （"navigationBarBackground"）的视图，并检查其可见性。如果找到且可见，则导航栏通常
//     * 是可见的。此外，还检查系统UI标志位来确认导航栏是否被隐藏。
//     *
//     * @param window 当前窗口，用于获取装饰视图并检查导航栏可见性。
//     * @return 如果导航栏可见返回true，否则返回false。
//     */
//    public static boolean isNavBarVisible(@NonNull final Window window) {
//        boolean isVisible = false;
//        ViewGroup decorView = (ViewGroup) window.getDecorView();
//        for (int i = 0, count = decorView.getChildCount(); i < count; i++) {
//            final View child = decorView.getChildAt(i);
//            final int id = child.getId();
//            if (id != View.NO_ID) {
//                String resourceEntryName = getResNameById(id);
//                if ("navigationBarBackground".equals(resourceEntryName)
//                        && child.getVisibility() == View.VISIBLE) {
//                    isVisible = true;
//                    break;
//                }
//            }
//        }
//        if (isVisible) {
//            int visibility = decorView.getSystemUiVisibility();
//            isVisible = (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
//        }
//
//        return isVisible;
//    }
//
//    /**
//     * 根据资源ID获取资源名称。
//     * 这个方法尝试通过资源ID来获取对应的资源名称。如果无法获取，则返回空字符串。
//     * 主要用于在程序中通过资源ID反向查找资源的名称，以便于调试或资源管理。
//     *
//     * @param id 要查询的资源ID。
//     * @return 对应的资源名称，如果无法获取则返回空字符串。
//     */
//    private static String getResNameById(int id) {
//        try {
//            return MyAppThis.getThis().getResources().getResourceEntryName(id);
//        } catch (Exception ignore) {
//            return "";
//        }
//    }
//
//    /**
//     * 设置窗口的导航栏颜色。
//     *
//     * @param activity 需要设置导航栏颜色的窗口对象。
//     * @param color    导航栏的颜色，使用ARGB格式的整数表示。
//     */
//    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
//    public static void setNavBarColor(@NonNull final Activity activity, @ColorInt final int color) {
//        setNavBarColor(activity.getWindow(), color);
//    }
//
//    /**
//     * 设置窗口的导航栏颜色。
//     * <p>
//     * 此方法用于在Android 5.0（API 级别 21）及更高版本中更改窗口导航栏的颜色。
//     * 通过设置窗口标志和导航栏颜色来实现这一功能。
//     *
//     * @param window 需要设置导航栏颜色的窗口对象。
//     * @param color  导航栏的颜色，使用ARGB格式的整数表示。
//     */
//    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
//    public static void setNavBarColor(@NonNull final Window window, @ColorInt final int color) {
//        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//        window.setNavigationBarColor(color);
//    }
//
//    /**
//     * 获取窗口的导航栏颜色。
//     * 本方法仅在Android 5.0（Lollipop）及更高版本上运行，因为getNavigationBarColor方法是在API级别21（Lollipop）引入的。
//     *
//     * @param activity 需要获取导航栏颜色的窗口对象。 必须是非空的，以确保方法调用不会失败。
//     * @return 窗口导航栏的颜色值。如果导航栏不存在或颜色未设置，可能返回默认颜色。
//     * @requiresApi apiLevel = Build.VERSION_CODES.LOLLIPOP 只有在Android 5.0及以上版本才能使用。
//     * @see Window#getNavigationBarColor() 获取导航栏颜色的方法。
//     */
//    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
//    public static int getNavBarColor(@NonNull final Activity activity) {
//        return getNavBarColor(activity.getWindow());
//    }
//
//    /**
//     * 获取窗口的导航栏颜色。
//     * 本方法仅在Android 5.0（Lollipop）及更高版本上运行，因为getNavigationBarColor方法是在API级别21（Lollipop）引入的。
//     *
//     * @param window 需要获取导航栏颜色的窗口对象。 必须是非空的，以确保方法调用不会失败。
//     * @return 窗口导航栏的颜色值。如果导航栏不存在或颜色未设置，可能返回默认颜色。
//     * @requiresApi apiLevel = Build.VERSION_CODES.LOLLIPOP 只有在Android 5.0及以上版本才能使用。
//     * @see Window#getNavigationBarColor() 获取导航栏颜色的方法。
//     */
//    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
//    public static int getNavBarColor(@NonNull final Window window) {
//        return window.getNavigationBarColor();
//    }
//
//    /**
//     * 判断设备是否支持导航栏。
//     * <p>
//     * 导航栏通常是指设备屏幕底部的虚拟导航键，用于操作设备（如返回、主页、多任务等）。
//     * 此方法通过检查设备的SDK版本以及是否存在物理菜单键和返回键来确定是否支持导航栏。
//     * 在Android 4.2及以上版本中，通过比较屏幕的真实尺寸和可见尺寸来判断是否存在导航栏。
//     * 在较低版本中，则通过检查是否存在物理菜单键和返回键来判断。
//     * </p>
//     *
//     * @return 如果设备支持导航栏，则返回false；否则返回true。
//     */
//    public static boolean isSupportNavBar() {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
//            WindowManager wm = (WindowManager) MyAppThis.getThis().getSystemService(Context.WINDOW_SERVICE);
//            if (wm == null) return false;
//            Display display = wm.getDefaultDisplay();
//            Point size = new Point();
//            Point realSize = new Point();
//            display.getSize(size);
//            display.getRealSize(realSize);
//            return realSize.y != size.y || realSize.x != size.x;
//        }
//        boolean menu = ViewConfiguration.get(MyAppThis.getThis()).hasPermanentMenuKey();
//        boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
//        return !menu && !back;
//    }
//
//    /**
//     * 设置导航栏的亮色模式。
//     *
//     * @param activity    需要设置导航栏模式的窗口对象。
//     * @param isLightMode 如果为true，则设置导航栏为亮色模式；如果为false，则设置为暗色模式。
//     */
//    public static void setNavBarLightMode(@NonNull final Activity activity,
//                                          final boolean isLightMode) {
//        setNavBarLightMode(activity.getWindow(), isLightMode);
//    }
//
//    /**
//     * 设置导航栏的亮色模式。
//     * <p>
//     * 该方法用于根据参数isLightMode的值，切换窗口的导航栏模式为亮色或暗色。
//     * 只有在Android 8.0（API 级别 26）及更高版本中，此功能才有效。
//     * </p>
//     *
//     * @param window      需要设置导航栏模式的窗口对象。
//     * @param isLightMode 如果为true，则设置导航栏为亮色模式；如果为false，则设置为暗色模式。
//     */
//    public static void setNavBarLightMode(@NonNull final Window window,
//                                          final boolean isLightMode) {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            View decorView = window.getDecorView();
//            int vis = decorView.getSystemUiVisibility();
//            if (isLightMode) {
//                vis |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
//            } else {
//                vis &= ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
//            }
//            decorView.setSystemUiVisibility(vis);
//        }
//    }
//
//    /**
//     * 判断导航栏是否处于亮色模式。
//     *
//     * @param activity 当前窗口的Window对象，用于获取装饰视图并检查系统UI标志。
//     * @return 如果导航栏处于亮色模式，则返回true；否则返回false。如果设备版本低于Android 8.0（Oreo），则始终返回false，因为亮色模式在该版本以下不支持。
//     */
//    public static boolean isNavBarLightMode(@NonNull final Activity activity) {
//        return isNavBarLightMode(activity.getWindow());
//    }
//
//    /**
//     * 判断导航栏是否处于亮色模式。
//     * <p>
//     * 本方法用于检查当前窗口的导航栏是否设置了亮色模式。亮色模式下，导航栏的颜色会比较亮，通常用于深色主题下。
//     *
//     * @param window 当前窗口的Window对象，用于获取装饰视图并检查系统UI标志。
//     * @return 如果导航栏处于亮色模式，则返回true；否则返回false。如果设备版本低于Android 8.0（Oreo），则始终返回false，因为亮色模式在该版本以下不支持。
//     */
//    public static boolean isNavBarLightMode(@NonNull final Window window) {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            View decorView = window.getDecorView();
//            int vis = decorView.getSystemUiVisibility();
//            return (vis & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0;
//        }
//        return false;
//    }
//
//    /**
//     * 设置窗口的导航栏为透明。
//     * 该方法适用于不同Android版本，以兼容方式实现导航栏透明。
//     * 对于Android 5.0及以上版本，直接设置导航栏颜色为透明。
//     * 对于Android 4.4至5.0版本，使用TRANSLUCENT_NAVIGATION标志使导航栏透明。
//     * 对于Android 4.4以下版本，透明导航栏功能不被支持。
//     *
//     * @param activity 需要设置透明导航栏的窗口。
//     */
//    public static void transparentNavBar(@NonNull final Activity activity) {
//        transparentNavBar(activity.getWindow());
//    }
//
//    /**
//     * 设置窗口的导航栏为透明。
//     * 该方法适用于不同Android版本，以兼容方式实现导航栏透明。
//     * 对于Android 5.0及以上版本，直接设置导航栏颜色为透明。
//     * 对于Android 4.4至5.0版本，使用TRANSLUCENT_NAVIGATION标志使导航栏透明。
//     * 对于Android 4.4以下版本，透明导航栏功能不被支持。
//     *
//     * @param window 需要设置透明导航栏的窗口。
//     */
//    public static void transparentNavBar(@NonNull final Window window) {
//        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) return;
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
//            window.setNavigationBarContrastEnforced(false);
//        }
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//            window.setNavigationBarColor(Color.TRANSPARENT);
//        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//            if ((window.getAttributes().flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) == 0) {
//                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//            }
//        }
//        View decorView = window.getDecorView();
//        int vis = decorView.getSystemUiVisibility();
//        int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
//        decorView.setSystemUiVisibility(vis | option);
//    }
//}
